const http = require('http')
const crypto = require('crypto') // 摘要
// console.log(crypto.createHash('md5').update('123').digest('base64')) // ICy5YqxZB1uWSwcVLSNLcA==
// console.log(crypto.createHmac('sha256', 'ljp').update('123').digest('base64')) // 加盐算法  ljp===盐值  123==摘要内容

/**
 * 摘要和加密的区别 在于摘要无法反推 加密可以解密
 */

const sign = (value) => {
    // 使用base64会又 +  /  = 转义的问题  使用base64url 代替base64 解决问题
    return crypto.createHmac('sha256', 'ljp').update(value).digest('base64url')
}

let server = http.createServer((req, res) => {
    let v = []
    res.setCookie = function (key, value, options = {}) {
        let args = []
        if (options.domain) {
            args.push(`domain=${options.domain}`)
        }
        if (options.path) {
            args.push(`path=${options.path}`)
        }
        if (options['max-age']) {
            args.push(`max-age=${options['max-age']}`)
        }

        if (options.httpOnly) {
            args.push(`httpOnly=${options.httpOnly}`)
        }
        if (options.signed) {
            v.push(`${key}.sign=${sign(value)}`)
        }

        v.push(`${key}=${value}; ${args.join('; ')}`)
        console.log(v)
        res.setHeader('Set-Cookie', v)
    }

    req.getCookie = function (key, options) {
        let cookie = req.headers.cookie
        let cookieObj = require('querystring').parse(cookie, '; ') || {}
        if (options.signed) { // 需要验证是否被篡改
            if (cookieObj[key + '.sign'] === sign(cookieObj[key])) {
                return cookieObj[key]
            } else {
                return 'empty'
            }
        }

        return cookieObj[key]

    }

    if (req.url === '/read') {
        // res.end(req.headers.cookie || 'empty') // 读取header种的cookie
        res.end(req.getCookie('name', { signed: true }))
    } else if (req.url === '/write') {
        // res.setHeader('Set-Cookie', ['name=ljp', 'age=22']) // 设置cookie
        // 设置a.ljp.cn时  b.ljp.cn无法读取cookie内容 设置.ljp.cn时都可以读取
        // 设置一级域名时  子域名都可以访问
        res.setCookie('name', 'ljp', { domain: '.ljp.cn', httpOnly: true, signed: true }) // path: '/write' 'max-age': 60,
        res.end('write end')
    } else {
        res.end()
    }

})

server.listen(3000, function () {
    console.log('server start port===3000')
})